package metodos;

import java.util.ArrayList;


public class TablaID3 {

    String nombreAtributo;
    ArrayList<TablaValoresID3> tablas;
    ArrayList<String> valoresClases;
    ArrayList<Integer> cantidades;
    int cantidad;

    public TablaID3() {
        tablas = new ArrayList<TablaValoresID3>();
        valoresClases = new ArrayList<String>();
        cantidades = new ArrayList<Integer>();
    }

    public void AgregarValor(String valor, String valorClase) {
        
        cantidad++;
        
        //Se incrementan las cantidades de valores de clases para la entropia del sistema.
        int indice = -1;
        for (int i = 0; i < valoresClases.size(); i++) {
            String aux = valoresClases.get(i);
            if(valorClase.equals(aux)){
                indice = i;
                int cant = cantidades.get(indice);
                cantidades.set(indice, cant + 1);
                break;
            }
        }
        if(indice == -1){
            valoresClases.add(valorClase);
            cantidades.add(1);
        }
        
        //Se incrementan las cantidades de valores de clases para la entropia de atributos
        indice = -1;
        for (int i = 0; i < tablas.size(); i++) {
            TablaValoresID3 tablaAux = tablas.get(i);
            String valorAux = tablaAux.getValor();
            if (valor.equals(valorAux)) {
                indice = i;
            }
        }
        TablaValoresID3 tabla;
        if (indice != -1) {
            tabla = tablas.get(indice);
            tabla.Agregar(valorClase);
            return;
        }
        tabla = new TablaValoresID3(valor);
        tabla.Agregar(valorClase);
        tablas.add(tabla);

    }

    public String getNombreAtributo() {
        return nombreAtributo;
    }

    public void setNombreAtributo(String nombreAtributo) {
        this.nombreAtributo = nombreAtributo;
    }

    public float getEntropia() {
        float resultado = 0;
        for (int i = 0; i < cantidades.size(); i++) {
            float aux = cantidades.get(i);
            aux = aux / cantidad;
            double log2 = Math.log(aux);
            log2 = log2/Math.log(2);
            resultado += aux * log2 * -1;
        }
        return resultado;
    }

    public ArrayList<TablaValoresID3> getTablasValores(){
        return tablas;
    }

    public int getCantidad() {
        return cantidad;
    }
    
    public String entropia() {
        String entropia = "";
        for (int i = 0; i < tablas.size(); i++) {
            TablaValoresID3 tabla = tablas.get(i);
            entropia += "\n" + tabla.getValor() + ": ";
            entropia += tabla.getEntropia();
        }

        return entropia;
    }
}
